#include "std_smart_ptr_apps.h"

std::shared_ptr<void> Guard(void* p) {
    return std::shared_ptr<void> sp(p,
        [this](void *p) { GetHandle()->Release(p); }
    );
}

// v2: 使用宏定义
#define GUARD(p) std::shared_ptr<void> p##p(p,     \
    [](void* p){ GetHandle()->Release(p); }        \
);

#define GUARDU(p) std::unique_ptr<void, void(*)(int*)> p##p(p,     \
    [](void* p){ GetHandle()->Release(p); }                        \
);



int std_smart_ptr_apps() {
    /**
     * @brief 假设存在如下三方库的内存管理方式
     * 
     * 
     *    void* p  = GetHandle()->Create();
     *    // dothing soamething 
     *    GetHandle()->Release(p);            //! 我们可能经常忘记释放
     */
    // v1: 使用guard实现
    void* p = GetHandle()->Create();
    auto sp = Guard(p);                       //! 这种仍然不安全，因为作者可能写成Guard(p), 其是一个右值, 这句话执行完后p就释放了

    // v2: 使用宏定义的方式

    return 0;
}